package pruebas;

import modelo.*;
import junit.framework.TestCase;

public class CarreraTest extends TestCase {
	
	private Jugador jugador;
	private Pista pista;
	private Carrera carrera;
	
	protected void setUp() throws Exception {
		super.setUp();
		jugador = new Jugador("alandex", new Auto(new Win32(), new Mess10()));
		pista = new Pista(40,30,30);
		carrera = new Carrera(jugador, pista);
	}
	
	public void testPausar() throws InterruptedException{
		assertTrue(carrera.estaPausada());
		assertFalse(carrera.termino());
		carrera.comenzar();
		jugador.getAuto().acelerar();
		Thread.sleep(500);
		
		carrera.pausar();
		double velocidad = jugador.getAuto().getVelocidad();
		int posicion = jugador.getAuto().getPosicionEnLargo();
		long tiempo = Cronometro.getInstance().getTiempo();
		
		Thread.sleep(500);
		assertTrue(velocidad == jugador.getAuto().getVelocidad());
		assertTrue(posicion == jugador.getAuto().getPosicionEnLargo());
		assertTrue(tiempo == Cronometro.getInstance().getTiempo());
		
		carrera.reanudar();
		Thread.sleep(500);
		assertFalse(velocidad == jugador.getAuto().getVelocidad());
		assertFalse(posicion == jugador.getAuto().getPosicionEnLargo());
		assertFalse(tiempo == Cronometro.getInstance().getTiempo());
		
		carrera.finalizar();
	}
	
	public void testGanoMoviendose() throws InterruptedException{
		carrera.comenzar();		
		jugador.getAuto().acelerar();
		Thread.sleep(100);
		jugador.getAuto().moverHaciaLaIzquierda();
		Thread.sleep(100);
		jugador.getAuto().moverHaciaLaIzquierda();
		Thread.sleep(100);
		jugador.getAuto().moverHaciaLaIzquierda();

		Thread.sleep(100);
		jugador.getAuto().moverHaciaLaDerecha();
		Thread.sleep(100);
		jugador.getAuto().moverHaciaLaDerecha();
		Thread.sleep(100);
		jugador.getAuto().moverHaciaLaDerecha();
		Thread.sleep(100);
		jugador.getAuto().moverHaciaLaDerecha();
		Thread.sleep(100);
		jugador.getAuto().moverHaciaLaDerecha();
		
		while (!carrera.termino()); /** GameLoop **/
		assertTrue(carrera.gano());
		assertEquals(4, jugador.getAuto().getPosicionEnAncho());
		assertEquals(carrera.getPista().getLargo() - 1, jugador.getAuto().getPosicionEnLargo());
		
	}
	
	public void testGanoLinealmente() throws InterruptedException{
		carrera.comenzar();		
		jugador.getAuto().acelerar();
		while (!carrera.termino()); /** GameLoop **/
		assertTrue(carrera.gano());
	}
	
	public void testIniciarYFinalizar() throws InterruptedException{
		assertSame(jugador, carrera.getJugador());
		assertSame(pista, carrera.getPista());
		assertTrue(carrera.estaPausada());
		assertFalse(carrera.termino());
		carrera.comenzar();
		Thread.sleep(200);
		assertEquals(2, jugador.getAuto().getPosicionEnAncho());
		assertEquals(0, jugador.getAuto().getPosicionEnLargo());
		jugador.getAuto().acelerar();
		jugador.getAuto().moverHaciaLaIzquierda();
		Thread.sleep(100);
		carrera.finalizar();
		assertEquals(2, jugador.getAuto().getPosicionEnAncho());
		assertFalse(carrera.gano());
	}
}